1、mmap 简介
	有些驱动在使用时需要频繁的操作内核空间的某一片内存，若采用传统的read和write会存在大量的内存拷贝，这将大大
降低程序效率，此时可以将内核虚拟地址所对应的物理内存映射到用户空间，以此减少内存拷贝。
2、应用层 mmap
	应用层可以使用 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) 函数将文
件映射到虚拟地址空间（包括设备文件），使用 int munmap(void *addr, size_t length) 来取消 mmap 的映射。
3、驱动层 mmap
	当应用层调用 mmap 时会调用到驱动层的 int (*mmap) (struct file *filp, struct vm_area_struct *vma) 函数，此
函数将根据用户传递的参数调用 int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned 
long pfn, unsigned long size, pgprot_t prot) 完成内存映射，下面对着两个函数进行详细介绍：
	/**
	 * filp 文件句柄
	 * vma 用于描述一个独立的虚拟内存区域
	 */
	int (*mmap) (struct file *filp, struct vm_area_struct *vma)
	/**
	 * vma 用于描述一个独立的虚拟内存区域
	 * addr 起始虚拟地址
	 * pfn 物理内存页框号
	 * size 映射空间的大小，最小为一页内存
	 * prot 访问权限，如果不想被cache可以采用prot = pgprot_noncached(prot)方式添加nocache标志
	 * 对于物理上不连续的内存空间可以循环调用此函数将这些内存映射到连续的虚拟地址空间
	 */
	int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, unsigned long 
	size, pgprot_t prot)
4、虚拟地址转物理地址页框号
	采用 __get_free_pages、__get_free_page、kmalloc 分配的用 virt_to_phys 可将虚拟地址转换为物理地址，然后将
物理地址左移 PAGE_SHIFT 位即可的到物理地址页框号，采用 vmalloc 分配的用 vmalloc_to_pfn 可将虚拟地址转换为物
理地址页框号。


